package jframe.common;

import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.xml.XMLSerializer;

import org.apache.commons.io.IOUtils;
import org.dom4j.Document;

/**
 * @描述:<p>Json转换类 </p>
 * 
 * @作者: 叶平平(yepp)
 * 
 * @时间: 2011-8-26 下午08:07:56
 */
public class JsonHelper {

	/**
	 * @描述:<p>list转换json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-8-26 下午09:54:08
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param totalCount	记录总数
	 * @param list			记录集
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonFromList(long totalCount, List list){
		TotalJson totalJson = new TotalJson();
		totalJson.setTotalCount(String.valueOf(totalCount));
		totalJson.setRoot(list);
		
		JSONObject jsonObject = JSONObject.fromObject(totalJson);
		
		return jsonObject.toString();
	}
	
	/**
	 * @描述:<p>list转换Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-8-26 下午09:49:15
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param list	记录集
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonFromList(List list){
		JSONArray jsonArray = JSONArray.fromObject(list);
		return jsonArray.toString();
	}
	/**
	 * @描述:<p>list转换Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-8-26 下午09:46:45
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param totalCount 	记录总数
	 * @param list		 	 记录集
	 * @param datePattern	日期格式
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String getJsonFromList(long totalCount, List list, String datePattern){
		if(datePattern == null ||  "".equals(datePattern)){
			datePattern = "yyyy-MM-dd HH:mm:ss";
		}
		TotalJson totalJson = new TotalJson();
		totalJson.setTotalCount(String.valueOf(totalCount));
		totalJson.setRoot(list);
		
		JsonConfig jsonConfig = configJson(null, datePattern);
		
		JSONObject jsonObject = JSONObject.fromObject(totalJson, jsonConfig);
		
		return jsonObject.toString();
	}
	/**
	 * @描述:<p>Object转换Json   </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-4 上午12:03:52
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param obj	对象
	 * @return
	 */
	public static String getJsonObject(Object obj){
		return JSONObject.fromObject(obj).toString();
	}
	
	/**
	 * @描述:<p>Array转换Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-4 上午12:21:01
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param array	数组
	 * @return
	 */
	public static String getJsonArray(Object array){
		return JSONArray.fromObject(array).toString();
	}
	
	/**
	 * @描述:<p>xml字符串转换为Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-6 下午03:47:07
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param xmlString xml字符串
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static String getJsonFromXml(String xmlString){
		XMLSerializer xmlSerializer = new XMLSerializer();
		return xmlSerializer.read(xmlString).toString();
	}
	
	/**
	 * @描述:<p>xmlDocument字符串转换为Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-6 下午03:47:07
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param xmlDocument	xml文档
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static String getJsonFromXml(Document xmlDocument){
		String xmlString = xmlDocument.toString();
		return getJsonFromXml(xmlString);
	}
	
	/**
	 * @描述:<p>读取xml文件转换为Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-6 下午03:47:07
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param xmlFile xml文件
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static String getJsonFromXmlFile(String xmlFile){
		InputStream is = JsonHelper.class.getResourceAsStream(xmlFile);
		String xml;
		JSON json = null;
		try {
			xml = IOUtils.toString(is);
			XMLSerializer xmlSerializer = new XMLSerializer();
			json = xmlSerializer.read(xml);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return json.toString();
	}
	
	/**
	 * @描述:<p>Map转换为Json  </p>
	 *
	 * @作者:  叶平平(yepp)
	 *
	 * @时间:  2011-11-6 下午03:47:07
	 *
	 * @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	 *
	 * @param xmlString
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static String getJsonFromMap(Map<?,?> map){
		return JSONObject.fromObject(map).toString();
	}
	
	public static JsonConfig configJson(String[] excludes, String datePattern){
		JsonConfig jsonConfig = new JsonConfig();
		if(excludes != null){
			jsonConfig.setExcludes(excludes);
		}
		jsonConfig.setIgnoreDefaultExcludes(false);
		jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
		jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(datePattern));
		return jsonConfig;
	}
}

class DateJsonValueProcessor implements JsonValueProcessor {
	public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
	private DateFormat dateFormat;

	/**
	 * 构造方法
	 */
	public DateJsonValueProcessor(String datePattern) {
		try {
			dateFormat = new SimpleDateFormat(datePattern);
		} catch (Exception e) {
			dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * net.sf.json.processors.JsonValueProcessor#processArrayValue(java.lang
	 * .Object, net.sf.json.JsonConfig)
	 */
	public Object processArrayValue(Object object, JsonConfig jsonconfig) {
		// TODO Auto-generated method stub
		return process(object);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * net.sf.json.processors.JsonValueProcessor#processObjectValue(java.lang
	 * .String, java.lang.Object, net.sf.json.JsonConfig)
	 */
	public Object processObjectValue(String key, Object object,
			JsonConfig jsonconfig) {
		// TODO Auto-generated method stub
		return process(object);
	}

	private Object process(Object object) {
		if (object != null && !"".equals(object)) {
			return dateFormat.format((Date) object);
		}
		return null;
	}

}
